/*
 * 文 件 名:  TestBeansUtil.java
 * 版    权:   深圳埃思欧纳信息咨询有限公司版权所有. YYYY-YYYY,  All rights reserved
 * 描    述:   <描述>
 * 修 改 人:  honny.huang
 * 修改时间: 2011-6-1
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.beans;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
 * <一句话功能简述> <功能详细描述>
 *
 * @author honny.huang
 * @version [版本号, 2011-6-1]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

public class TestBeansUtil {

	 @SuppressWarnings("unchecked")
	public static Class findPropertyType(String propertyName, Class clazz) throws IntrospectionException
	 {
	       PropertyDescriptor pd = new PropertyDescriptor(propertyName, clazz);
	           
	       System.out.println("getter="+pd.getReadMethod());    
	       System.out.println("setter="+pd.getWriteMethod());
	           
	       if (pd != null)
	         return pd.getPropertyType();
	       else
	         return Object.class;
	 }
	    
    @SuppressWarnings("unchecked")
	public static Class getMethodType(Method method)
    {
    	  Class clazz = method.getReturnType();
    	  return clazz;
    }
    
    @SuppressWarnings("unchecked")
	public static Class getMethodGenericType(Method method)
    {
        
        Type type = method.getGenericReturnType();
        
        if (type instanceof ParameterizedType)
        {
            ParameterizedType ptype = (ParameterizedType)type;            
            return (Class)ptype.getActualTypeArguments()[0];
        }
        
        return Object.class;
    }    
    
    public static void main(String[] args) throws IntrospectionException,ClassNotFoundException,IllegalAccessException,NoSuchMethodException
    {
    	 PropertyDescriptor pd = new PropertyDescriptor("name", TestBean.class);
    	 System.out.println("getter="+pd.getReadMethod());    
    	  //获取id属性的类型
//    	  System.out.println( TestBeansUtil.findPropertyType( "id", TestBean.class ).getName() );
    	  //获取name属性的类型
    	  System.out.println( TestBeansUtil.findPropertyType( "name", TestBean.class ).getName() );
    	  //获取joined属性的类型
    	  System.out.println( TestBeansUtil.findPropertyType( "joined", TestBean.class ).getName() );
    	  //获取birthday属性的类型
    	  System.out.println( TestBeansUtil.findPropertyType( "birthday", TestBean.class ).getName() );
    	  //获取getGreeting()方法的返回值类型
//    	  Method method1=Class.forName("TestBean").getMethod( "getGreeting", new Class[]{} );
//    	  System.out.println( TestBeansUtil.getMethodType( method1 ).getName() );
    	  //获取getTestBeans()方法的返回值类型和泛型
    	  Method method2=Class.forName("TestBean").getMethod( "getTestBeans", new Class[]{} );
//    	  System.out.println( TestBeansUtil.getMethodType( method2 ).getName() );
//    	  System.out.println( TestBeansUtil.getMethodGenericType( method2 ).getName() );
    }
}
